"""
配置工具模块
用于处理打包后的配置文件路径
"""

import os
import sys
import shutil
from pathlib import Path
from typing import Optional

from ragflow_client.utils.logger import get_logger

logger = get_logger(__name__)


def get_app_dir() -> Path:
    """
    获取应用程序目录
    
    Returns:
        应用程序目录路径
    """
    if getattr(sys, 'frozen', False):
        # 打包后的应用程序
        if sys.platform == 'darwin':
            # macOS: /path/to/RagFlow.app/Contents/MacOS
            app_dir = Path(sys.executable).parent
        else:
            # Windows/Linux: /path/to/RagFlow
            app_dir = Path(sys.executable).parent
    else:
        # 开发环境
        app_dir = Path(os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))))
    
    logger.debug(f"应用程序目录: {app_dir}")
    return app_dir


def get_config_dir() -> Path:
    """
    获取配置目录
    
    Returns:
        配置目录路径
    """
    if getattr(sys, 'frozen', False):
        # 打包后的应用程序
        if sys.platform == 'darwin':
            # macOS: ~/Library/Application Support/RagFlow
            config_dir = Path.home() / "Library" / "Application Support" / "RagFlow"
        elif sys.platform == 'win32':
            # Windows: %APPDATA%\RagFlow
            config_dir = Path(os.environ.get('APPDATA', '')) / "RagFlow"
        else:
            # Linux: ~/.config/ragflow
            config_dir = Path.home() / ".config" / "ragflow"
    else:
        # 开发环境，使用项目根目录
        config_dir = get_app_dir()
    
    # 确保配置目录存在
    config_dir.mkdir(parents=True, exist_ok=True)
    
    logger.debug(f"配置目录: {config_dir}")
    return config_dir


def get_env_file_path() -> Path:
    """
    获取.env文件路径
    
    Returns:
        .env文件路径
    """
    config_dir = get_config_dir()
    env_path = config_dir / ".env"
    
    # 如果配置目录中不存在.env文件，尝试从应用程序目录复制
    if not env_path.exists():
        app_dir = get_app_dir()
        default_env_path = app_dir / ".env"
        
        if default_env_path.exists():
            logger.info(f"从 {default_env_path} 复制默认配置到 {env_path}")
            shutil.copy2(default_env_path, env_path)
        else:
            # 创建一个空的.env文件
            logger.info(f"创建空的配置文件: {env_path}")
            with open(env_path, 'w', encoding='utf-8') as f:
                f.write("# RagFlow 配置文件\n")
                f.write("RAGFLOW_API_URL=\n")
                f.write("RAGFLOW_API_KEY=\n")
                f.write("RAGFLOW_KB_ID=\n")
                f.write("RAGFLOW_KB_NAME=\n")
                f.write("RAGFLOW_PARSER_ID=naive\n")
                f.write("RAGFLOW_DOC_DIR=\n")
                f.write("RAGFLOW_DOC_SUFFIX=md,txt,pdf,docx\n")
                f.write("THEME=light\n")
                f.write("DEBUG=false\n")
    
    logger.debug(f".env文件路径: {env_path}")
    return env_path


def load_env_file() -> None:
    """
    加载.env文件
    """
    from dotenv import load_dotenv
    
    env_path = get_env_file_path()
    logger.info(f"加载配置文件: {env_path}")
    load_dotenv(dotenv_path=env_path, override=True)


def save_env_variable(key: str, value: str) -> None:
    """
    保存环境变量到.env文件
    
    Args:
        key: 环境变量名
        value: 环境变量值
    """
    env_path = get_env_file_path()
    
    # 读取现有内容
    if env_path.exists():
        with open(env_path, 'r', encoding='utf-8') as f:
            lines = f.readlines()
    else:
        lines = []
    
    # 查找并替换或添加环境变量
    key_found = False
    for i, line in enumerate(lines):
        if line.strip().startswith(f"{key}="):
            lines[i] = f"{key}={value}\n"
            key_found = True
            break
    
    if not key_found:
        lines.append(f"{key}={value}\n")
    
    # 写回文件
    with open(env_path, 'w', encoding='utf-8') as f:
        f.writelines(lines)
    
    logger.debug(f"保存环境变量: {key}={value}")